#ifndef __UDP_SERVER__H
#define __UDP_SERVER__H
#include <Poco/Net/SocketAddress.h>
#include <Poco/Net/DatagramSocket.h>
#include <Poco/ActiveMethod.h>
#include <Poco/Event.h>
#include <Poco/Tuple.h>
#include <Poco/ExpireLRUCache.h>
#include <Poco/Mutex.h>


class UDPServer
{
public:
	enum TStatus{
		EStop,
		EStart
	};
	UDPServer(const Poco::Net::SocketAddress& sa);
	virtual ~UDPServer(void);
	typedef Poco::Tuple<Poco::Net::SocketAddress , Poco::UInt64> TSessionAddress;

public:
	Poco::ActiveMethod<void , void , UDPServer >Start;

	Poco::ActiveMethod<void , TSessionAddress , UDPServer> ServeSession;
private:
	void StartImp();
	void Stop();
	void ServeSessionImp(const TSessionAddress&);
private:
	Poco::Net::DatagramSocket iServerSocket;
	Poco::Event iStopEven;
	TStatus iStatus;
	Poco::ExpireLRUCache<Poco::UInt64 , Poco::Net::SocketAddress > iSession2FirstAddr;

};

#endif
